#include <linux/kernel.h>
#include <linux/init.h>     /* module_init module_exit */
#include <linux/module.h>   /* MODULE_LICENSE */


// 模块入口函数
static int __init printk_demo_init(void)
{
    printk("printk_demo module init!\n");

    printk(KERN_EMERG"KERN_EMERG:%s\r\n", KERN_EMERG);
    printk(KERN_ALERT"KERN_ALERT:%s\r\n", KERN_ALERT);
    printk(KERN_CRIT"KERN_CRIT:%s\r\n", KERN_CRIT);
    printk(KERN_ERR"KERN_ERR:%s\r\n", KERN_ERR);
    printk(KERN_WARNING"KERN_WARNING:%s\r\n", KERN_WARNING);
    printk(KERN_NOTICE"KERN_NOTICE:%s\r\n", KERN_NOTICE);
    printk(KERN_INFO"KERN_INFO:%s\r\n", KERN_INFO);
    printk(KERN_DEBUG"KERN_DEBUG:%s\r\n", KERN_DEBUG);
	return 0;
}

// 模块出口函数
static void __exit printk_demo_exit(void)
{
	printk("printk_demo exit!\n");
}

// 将__init定义的函数指定为驱动的入口函数
module_init(printk_demo_init);


// 将__exit定义的函数指定为驱动的出口函数
module_exit(printk_demo_exit);

/* 模块信息(通过 modinfo printk_demo 查看) */
MODULE_LICENSE("GPL");               /* 源码的许可证协议 */
MODULE_AUTHOR("sumu");               /* 字符串常量内容为模块作者说明 */
MODULE_DESCRIPTION("Description");   /* 字符串常量内容为模块功能说明 */
MODULE_ALIAS("module's other name"); /* 字符串常量内容为模块别名 */
